/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package models;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;


public class Archivo {
    private static String dir="partidas-sudoku.xml"; //Direccion donde vamos a alojar  el archivo xml.
    private static String dir2="top-ten.xml";
    
    
    /*
     * Metodo utilizado para explorar los tag del xml.
     */
    private static String getTagValue(String tag, Element elemento) {
        NodeList lista = elemento.getElementsByTagName(tag).item(0).getChildNodes();
        Node valor = (Node) lista.item(0);
        return valor.getNodeValue();
    }
    
    
    
    private static ArrayList<ArrayList<String>> getListTopTen() throws ParserConfigurationException, SAXException, IOException {
        DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
        Document doc = docBuilder.parse (new File(dir2));

        NodeList listaPartidas = doc.getElementsByTagName("puesto");
        Element elemento;
        ArrayList<ArrayList<String>> partidas = new ArrayList();
        ArrayList<String> partida= new ArrayList();
        for (int i = 0; i <listaPartidas.getLength() ; i ++) {
        	Node partidanode = (Node) listaPartidas.item(i);
        	if (partidanode.getNodeType() == Node.ELEMENT_NODE) {
                        partida = new ArrayList();
        		elemento = (Element) partidanode;
        		partida.add(getTagValue("nombre",elemento ));
                        partida.add(getTagValue("horas",elemento ));
                        partida.add(getTagValue("minutos",elemento ));
                        partida.add(getTagValue("segundos",elemento ));
                        partidas.add(partida);
                        
        	}
        }
        return partidas;
    }
    
   
    public static ArrayList<String> obtenerPartida(){
        ArrayList<String> result = new ArrayList();
        try {
            result = getPartida();
        } catch (ParserConfigurationException ex) {
        } catch (SAXException ex) {
        } catch (IOException ex) {
        }
        
        return result;
        
    }

    private static ArrayList<String> getPartida() throws ParserConfigurationException, SAXException, IOException {
        DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
        Document doc = docBuilder.parse (new File(dir));
        NodeList listaPartidas = doc.getElementsByTagName("partidas-sudoku");
        Element elemento;
        ArrayList<String> elempartida = new ArrayList();
        	Node partida = (Node) listaPartidas.item(0);
        	if (partida.getNodeType() == Node.ELEMENT_NODE) {
        		elemento = (Element) partida;
        			elempartida.add(getTagValue("juego",elemento));
        			elempartida.add(getTagValue("flag",elemento));
        			elempartida.add(getTagValue("minutos",elemento));
                                elempartida.add(getTagValue("segundos",elemento));
                                elempartida.add(getTagValue("milisegundos",elemento));
                                
        		}
                return elempartida;
    }

    
    
    
    /*
     *Toma los parametros y agrega una partida nueva, retorna un booleano con el resultado de la operacion(True o False).
     */
   public static boolean agregarPartida( int[][] juego, int[][] flag, int min,int seg,int mil ){
        try {
		ArrayList<String> nuevaPartida = new ArrayList();
		nuevaPartida.add(Conversor.matrizIntToString(juego));
		nuevaPartida.add(Conversor.matrizIntToString(flag));
		nuevaPartida.add(Integer.toString(min));
                nuevaPartida.add(Integer.toString(seg));
                nuevaPartida.add(Integer.toString(mil));
		try {
                    cargarPartida(nuevaPartida);
                    return true;
                    } catch (TransformerFactoryConfigurationError e1) {
			return false;
                    } catch (TransformerException e1) {
			return false;
                    }	
	} catch (SAXException e) {
            return false;
	} catch (IOException e) {
            return false;
	} catch (ParserConfigurationException e) {
            return false;
	}
    }
        
    private static void  cargarPartida(ArrayList<String> partidaNueva) throws  TransformerFactoryConfigurationError, TransformerException, ParserConfigurationException, SAXException, IOException {
    	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    	DocumentBuilder builder = factory.newDocumentBuilder();
    	DOMImplementation implementation = builder.getDOMImplementation();
    	Document document = implementation.createDocument(null, "partidas-sudoku", null);
    	Element raiz = document.getDocumentElement();
    	
    	Element partida;
    	Element juego; Text valorJuego; 
    	Element flag; Text valorFlag; 
    	Element minutos; Text valorMinutos;
        Element segundos; Text valorSegundos;
        Element milisegundos; Text valorMilisegundos;
    	partida = document.createElement("partidas-guardadas"); 	
    	juego = document.createElement("juego");
    	valorJuego = document.createTextNode(partidaNueva.get(0));
    	juego.appendChild(valorJuego);
    	partida.appendChild(juego);
        
       	flag = document.createElement("flag");
    	valorFlag = document.createTextNode(partidaNueva.get(1));
    	flag.appendChild(valorFlag);
    	partida.appendChild(flag);
        
       	minutos = document.createElement("minutos");
    	valorMinutos = document.createTextNode(partidaNueva.get(2));
    	minutos.appendChild(valorMinutos);
    	partida.appendChild(minutos);
        
       	segundos = document.createElement("segundos");
    	valorSegundos = document.createTextNode(partidaNueva.get(3));
    	segundos.appendChild(valorSegundos);
    	partida.appendChild(segundos);
        
        milisegundos = document.createElement("milisegundos");
    	valorMilisegundos = document.createTextNode(partidaNueva.get(4));
    	milisegundos.appendChild(valorMilisegundos);
    	partida.appendChild(milisegundos);
        
    	raiz.appendChild(partida);
        
    	Source source = new DOMSource(document);
    	Result result = new StreamResult(new java.io.File(dir)); //nombre del archivo
    	Transformer transformer = TransformerFactory.newInstance().newTransformer();
    	transformer.transform(source, result);
    	
    }
    
    
    
    private static void  setTopTen(ArrayList<ArrayList<String>> todasPartidas) throws  TransformerFactoryConfigurationError, TransformerException, ParserConfigurationException, SAXException, IOException {
    	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    	DocumentBuilder builder = factory.newDocumentBuilder();
    	DOMImplementation implementation = builder.getDOMImplementation();
    	Document document = implementation.createDocument(null, "top-ten", null);
    	Element raiz = document.getDocumentElement();
    	
    	Element partida; 
    	Element nombre; Text valorNombre; 
    	Element horas; Text valorHoras; 
    	Element minutos; Text valorMinutos; 
    	Element segundos; Text valorSegundos;
    	
    	ArrayList<String> partidaTemp = new ArrayList();
    	for(int i=0;i<todasPartidas.size() ;i++ ){
    		partidaTemp = todasPartidas.get(i);
    		partida = document.createElement("puesto"); 
        	nombre = document.createElement("nombre");
        	valorNombre = document.createTextNode(partidaTemp.get(0));
        	nombre.appendChild(valorNombre);
        	partida.appendChild(nombre);    	
        	horas = document.createElement("horas");
        	valorHoras = document.createTextNode(partidaTemp.get(1));
        	horas.appendChild(valorHoras);
        	partida.appendChild(horas);
           	minutos = document.createElement("minutos");
        	valorMinutos = document.createTextNode(partidaTemp.get(2));
        	minutos.appendChild(valorMinutos);
        	partida.appendChild(minutos);
           	segundos = document.createElement("segundos");
        	valorSegundos = document.createTextNode(partidaTemp.get(3));
        	segundos.appendChild(valorSegundos);
        	partida.appendChild(segundos);
        	raiz.appendChild(partida);
    	}

    	Source source = new DOMSource(document);
    	Result result = new StreamResult(new java.io.File(dir2)); //nombre del archivo
    	Transformer transformer = TransformerFactory.newInstance().newTransformer();
    	transformer.transform(source, result);
    }
    
   public static void cargarTopTen(ArrayList<ArrayList<String>> todasPartidas){
        try {
            setTopTen(todasPartidas);
        } catch (TransformerFactoryConfigurationError ex) {            
        } catch (TransformerException ex) {        
        } catch (ParserConfigurationException ex) {          
        } catch (SAXException ex) {         
        } catch (IOException ex) {
        }
   }
   
   public static ArrayList<ArrayList<String>> obtenerTopTen(){
        ArrayList<ArrayList<String>> todasPartidas = new ArrayList();
        try {
            todasPartidas = getListTopTen();
        } catch (ParserConfigurationException ex) {       
        } catch (SAXException ex) {          
        } catch (IOException ex) {
        }
        return todasPartidas;
       
   }


}
